# Класс для работы с файлом

Производит потокобезопасные операции с файлом. Обеспечивает безопасный доступ к файлу из разных процессов. 

**Концепция:**
 - Основная задача - инкапсуляция эксклюзивной и общей блокировки файла при чтении/записи из нескольких потоков или процессов.
 - Блокировка файла осуществляется функцией flock().

**Методы:**
 - Открытие файла и получение его дескриптора.
 - Простые и потокобезопасные чтение и запись.
 - Изменение прав доступа и владельцев.
 - Один экземпляр класса - один файл. Для каждого файла надо создавать новый экземпляр.
 - Если операция с файлом невозможна, error_number() возвращает код последней ошибки. error_message() - сообщение об ошибке.
   - Ошибки не очищаются самостоятельно, для этого есь метод error_clear().

Методы класса работают по принципу Guaranteed Execution. Это значит:

- Если файл открыт только для записи, то `fread()` переоткроет файл только для чтения. 
- Функция `fwrite()` насовсем снимет блокировку если она установлена в LOCK_SH.
- Функция `fsize()` создаст новый файл если он отсутствует.
- Если любая функция находит нарушение условий для своего выполнения, она их сбрасывает к значениям по умолчанию. Например если `fread()` обнаруживает, что дескриптор файла открыт только для записи, то она переоткроет файл для чтения и закроет его насовсем поле выполнения всех своих операций и не откроет заново.
- В целом все функции будут автоматически изменять внешние условия если они противоречат выполняемой задаче.
- Описания конкретного поведения каждой функции в файлах исходного кода.

Это надо учитывать при многопоточной работе и всегда следить чтобы условия выполнения одной функции не противоречили другим. 
Например если очень важно чтобы дескриптор открытого файла сохранился на протяжении нескольких вызовов, то не стоит перед вызовом `fread()` вызвать `fopen()` с флагами только для записи итп. Либо использовать ссылочные типы для доступа к дескриптору.

test migrate on gitverse